#include <iostream>
using namespace std;

/*
	运算符重载：赋予运算符一种新的含义
		系统只是支持内置内型的基本运算
		+ - * / % == >= <= == != 
		* 二元运算符  乘法
		* 取值（二次取值/解引用）运算符

		int x = 3, y = 4;

		int z = x + y;			//int + int
		double u = 3.2;
		u + x;					//double + int

		x + y = z;
		Point + Point ---->?????
		Point operator+(Point lhs, Point rhs)
		全局运算符重载函数的设计：
			1 函数名
				operator 运算符
			2 参数列表
				个数：运算符是一个几元运算符
				类型：参与元素的操作数决定
			3 返回值
				运算的结果类型

		成员运算符重载函数的设计：
			1 函数名
				operator 运算符
			2 参数列表
				个数：运算符是一个几元运算符（所有的成员函数都有一个隐士的this参数）
				类型：参与元素的操作数决定
			3 返回值
				运算的结果类型

			
*/

class Point{
private:
	int 	x;
	int 	y;
public:
	Point(int x, int y);

	void setX(int x) { this->x = x; }
	int getX() const { return this->x; }

	void setY(int y) { this->y = y; }
	int getY() const { return this->y; }

	void display() const 
	{
		cout << "(" << this->x << ", " << this->y << ")" << endl;
	}

	//重载减法运算符
	const Point operator - (const Point& rhs) const;
};

const Point Point::operator -(const Point& rhs) const
{
	int x = this->x - rhs.getX();
	int y = this->y - rhs.getY();
	return Point(x, y);
}

Point::Point(int x, int y)
	:x(x),
	y(y)
{

}

const Point operator + (const Point& lhs, const Point& rhs)
{
	int x = lhs.getX() + rhs.getX();
	int y = lhs.getY() + rhs.getY();

	Point p(x, y);
	return p;
}



//实现两个点之间的相加
Point addPoint(const Point& lhs, const Point& rhs)
{
	int x = lhs.getX() + rhs.getX();
	int y = lhs.getY() + rhs.getY();

	Point p(x, y);
	return p;
}

int main(int argc, char **argv)
{
	Point p(3, 4);
	Point p1(2, 2);
	p.display();
	p1.display();
	
	//Point p2 = p.operator -(p1);
	Point p2 = p - p1;
	p2.display();		//(1, 2)

	/*

	Point p2 = addPoint(p, p1);
	p2.display();			//(5, 6)

	//Point p3  = operator+(p, p1);			//Point + Point
	Point p3 = p + p1;
	p3.display();

	p2 + p3 = p1;			//垃圾代码
	*/
	return 0;
}
